 1.Region拆分机制
   
   Region中存储的是大量的rowkey数据 ,当Region中的数据条数过多的时候,直接影响查询效率.当
Region过大的时候.HBase会拆分Region , 这也是Hbase的一个优点
 
 2.拆分策略
   
   HBase的Region Split策略一共有以下几种：
   1).ConstantSizeRegionSplitPolicy
   0.94 版本前默认切分策略
   当region大小大于某个阈值(hbase.hregion.max.filesize=10G)之后就会触发切分，一个region等
分为2个region。
   但是在生产线上这种切分策略却有相当大的弊端：切分策略对于大表和小表没有明显的区分。阈值
(hbase.hregion.max.filesize)设置较大对大表比较友好，但是小表就有可能不会触发分裂，极端情况
下可能就1个，这对业务来说并不是什么好事。如果设置较小则对小表友好，但一个大表就会在整个集群产生
大量的region，这对于集群的管理、资源使用、failover来说都不是一件好事。
   2).IncreasingToUpperBoundRegionSplitPolicy
   0.94 版本~2.0 版本默认切分策略
   切分策略稍微有点复杂，总体看和ConstantSizeRegionSplitPolicy思路相同，一个region大小大于设
置阈值就会触发切分。但是这个阈值并不像ConstantSizeRegionSplitPolicy是一个固定的值，而是会
在一定条件下不断调整，调整规则和region所属表在当前regionserver上的region个数有关系.
   region split的计算公式是：
   regioncount^3 * 128 M *2,当region达到该size的时候进行split
   例如：
   第一次split：1^3 * 256 = 256 MB
   第二次split：2^3 * 256 = 204 8MB
   第三次split：3^3 * 256 = 6912 MB
   第四次split：4^3 * 256 = 16384 MB > 10 GB，因此取较小的值10GB
   后面每次split的size都是10GB了
   3).SteppingSplitPolicy
   2.0 版本默认切分策略
   这种切分策略的切分阈值又发生了变化，相比 IncreasingToUpperBoundRegionSplitPolicy 简单了
一些，依然和待分裂region所属表在当前regionserver上的region个数有关系，如果region个数等于1,
切分阈值为flush size * 2,否则为MaxRegionFileSize。这种切分策略对于大集群中的大表、小表会
比 IncreasingToUpperBoundRegionSplitPolicy 更加友好，小表不会再产生大量的小region，而是
适可而止。
  4).KeyPrefixRegionSplitPolicy
  根据rowKey的前缀对数据进行分组，这里是指定rowKey的前多少位作为前缀，比如rowKey都是16位的，指
定前5位是前缀，那么前5位相同的rowKey在进行region split的时候会分到相同的region中。
  5).DelimitedKeyPrefixRegionSplitPolicy
  保证相同前缀的数据在同一个region中，例如rowKey的格式为：userid_eventtype_eventid，指定的
delimiter为 _ ，则split的的时候会确保userid相同的数据在同一个region中。
  6).DisabledRegionSplitPolicy
  不启用自动拆分, 需要指定手动拆分
 
 3.RegionSplitPolicy的应用
   
   Region拆分策略可以全局统一配置，也可以为单独的表指定拆分策略。
   1).通过hbase-site.xml全局统一配置(对hbase所有表生效)
   <property>
       <name>hbase.regionserver.region.split.policy</name>
       <value>org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy</value>
   </property>
   2).通过Java API为单独的表指定Region拆分策略
   HTableDescriptor tableDesc = new HTableDescriptor("test1");
   tableDesc.setValue(HTableDescriptor.SPLIT_POLICY,IncreasingToUpperBoundRegionSplitPolicy.class.getName());
   tableDesc.addFamily(new HColumnDescriptor(Bytes.toBytes("cf1")));
   admin.createTable(tableDesc);
   3).通过HBase Shell为单个表指定Region拆分策略
   hbase> create 'test2', {METADATA => {'SPLIT_POLICY' =>
'org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy'}},{NAME => 'cf1'}
   
 
 4.HBase表的预分区(region)
   
   1).为何要预分区？
   当一个table刚被创建的时候，Hbase默认的分配一个region给table。也就是说这个时候，所有的
读写请求都会访问到同一个regionServer的同一个region中，这个时候就达不到负载均衡的效果了，集
群中的其他regionServer就可能会处于比较空闲的状态。解决这个问题可以用pre-splitting,在创建table
的时候就配置好，生成多个region。
   (1).增加数据读写效率
   (2).负载均衡，防止数据倾斜
   (3).方便集群容灾调度region
   每一个region维护着startRow与endRowKey，如果加入的数据符合某个region维护的rowKey范
围，则该数据交给这个region维
   2).手动指定预分区
   create 'person','info1','info2',SPLITS => ['1000','2000','3000']
   也可以把分区规则创建于文件中
   vim split.txt
   文件内容
aaa
bbb
ccc
ddd
   执行
   create 'student','info',SPLITS_FILE => '/root/hbase/split.txt'
 
 5.Region合并
   
   1).Region合并说明
   Region的合并不是为了性能，而是出于维护的目的。
   2).如何进行Region合并
   (1).通过Merge类冷合并Region
       需要先关闭hbase集群
       需求：需要把student表中的2个region数据进行合并：
       student,,1593244870695.10c2df60e567e73523a633f20866b4b5.
       student,1000,1593244870695.0a4c3ff30a98f79ff6c1e4cc927b3d0d.
	   这里通过org.apache.hadoop.hbase.util.Merge类来实现，不需要进入hbase shell，直接执行(需要
先关闭hbase集群)：
   hbase org.apache.hadoop.hbase.util.Merge student \
   student,,1595256696737.fc3eff4765709e66a8524d3c3ab42d59. \
   student,aaa,1595256696737.1d53d6c1ce0c1bed269b16b6514131d0.
  (2).通过online_merge热合并Region
      不需要关闭hbase集群，在线进行合并
	  与冷合并不同的是，online_merge的传参是Region的hash值，而Region的hash值就是Region名称的最
后那段在两个.之间的字符串部分。
      需求：需要把lagou_s表中的2个region数据进行合并：
      student,,1587392159085.9ca8689901008946793b8d5fa5898e06. \
      student,aaa,1587392159085.601d5741608cedb677634f8f7257e000.
	  需要进入hbase shell：
	  merge_region 'c8bc666507d9e45523aebaffa88ffdd6','02a9dfdf6ff42ae9f0524a3d8f4c7777'
	  成功后观察界面